package main

import "fmt"

func main() {
	/*
		数据类型：
			值类型：int, float, bool, string, array, struct

			引用类型：slice, map, function, pointer

		通过指针：
			new() 创建指针，默认值不是 nil（空指针）
				指向了新分配的类型的内存空间，里面存储的是 0 值
	*/
	//1.结构体是值类型的数据
	p1 := Person1{"喜羊羊", 18, "男", "青青草原羊村"}
	fmt.Println(p1)
	fmt.Printf("%p,%T\n", &p1, p1)

	p2 := p1
	fmt.Println(p2)
	fmt.Printf("%p,%T\n", &p2, p2)

	p2.name = "懒羊羊"
	fmt.Println(p1) //{喜羊羊 18 男 青青草原羊村}
	fmt.Println(p2) //{懒羊羊 18 男 青青草原羊村}

	//2.定义结构体指针
	var pp1 *Person1
	pp1 = &p1
	fmt.Println(pp1)                //&{喜羊羊 18 男 青青草原羊村}
	fmt.Printf("%p,%T\n", pp1, pp1) //0xc000068040,*main.Person1
	fmt.Println(*pp1)

	//(*pp1).name = "慢羊羊"
	//可简化为：
	pp1.name = "慢羊羊"
	fmt.Println(pp1)  //&{慢羊羊 18 男 青青草原羊村}
	fmt.Println(*pp1) //{慢羊羊 18 男 青青草原羊村}
	fmt.Println(p1)   //&{慢羊羊 18 男 青青草原羊村}

	//使用内置函数 new()，go语言中专门用于创建某种类型的指针的函数
	pp2 := new(Person1)
	fmt.Printf("%T\n", pp2) //*main.Person1
	fmt.Println(pp2)        //&{ 0  }
	pp2.name = "Jerry"
	pp2.age = 6
	pp2.sex = "男"
	pp2.address = "鼠鼠家"
	fmt.Println(pp2) //&{Jerry 6 男 鼠鼠家}

	//new() 函数创建其他类型的指针
	pp3 := new(int)
	fmt.Println(pp3)  //0xc00000e100
	fmt.Println(*pp3) //0

}

type Person1 struct {
	name    string
	age     int
	sex     string
	address string
}
